package traveldreampm.web;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import org.primefaces.event.RowEditEvent;

import traveldreampm.ejb.dtos.*;
import traveldreampm.ejb.manager.*;

@ManagedBean
@RequestScoped
public class ProdottiBean {

	@EJB
	GestoreProdottiLocal gestoreProdotti;

	@ManagedProperty(value = "#{autenticazioneBean}")
	private AutenticazioneBean autenticazioneBean;

	private ProdottoDTO prodottoDTO;

	private List<ProdottoDTO> prodottiDTOList;
	
	public ProdottiBean() {
		prodottoDTO = new ProdottoDTO();
	}

	@PostConstruct
	public void init() {
		this.prodottiDTOList = gestoreProdotti.getProdotti();
	}

	public TipologiaProdotto[] getTipologiaProdottoValues() {
		return TipologiaProdotto.values();
	}

	public List<ProdottoDTO> getProdottiDTOList() {
		return prodottiDTOList;
	}

	public void setProdottiDTOList(List<ProdottoDTO> prodottiDTOList) {
		this.prodottiDTOList = prodottiDTOList;
	}

	public AutenticazioneBean getAutenticazioneBean() {
		return autenticazioneBean;
	}

	public void setAutenticazioneBean(AutenticazioneBean autenticazioneBean) {
		this.autenticazioneBean = autenticazioneBean;
	}

	public ProdottoDTO getProdottoDTO() {
		return prodottoDTO;
	}

	public void setProdottoDTO(ProdottoDTO prodottoDTO) {
		this.prodottoDTO = prodottoDTO;
	}
	
	public ProdottoDTO getProdottoDTOFromId(int idProdotto) {
		return gestoreProdotti.getProdottoDTOFromId(idProdotto);
	}

	public String aggiungiProdotto() {
		this.prodottoDTO.setIdCreatore(autenticazioneBean.getUtenteDTO().getIdUtente());
		try {
			gestoreProdotti.addProdotto(this.prodottoDTO);
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(
					"messaggesGestioneProdotti",
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Errore nell'inserimento del prodotto.",
							e.getMessage()));
			return null;
		}
		this.prodottoDTO = new ProdottoDTO();
		FacesContext.getCurrentInstance().addMessage("addProdotto",
				new FacesMessage("Prodotto aggiunto con successo!"));

		return null;
	}

	public void modificaProdotto(RowEditEvent event) {
		ProdottoDTO prodottoModificato = (ProdottoDTO) event.getObject();
		try {
			gestoreProdotti.modifyProdotto(prodottoModificato);
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(
					"messaggesGestioneProdotti",
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Errore nella modifica del prodotto.",
							e.getMessage()));
			return;
		}
		FacesContext.getCurrentInstance().addMessage(
				"messaggesGestioneProdotti",
				new FacesMessage("Prodotto modificato con successo!"));
	}

	public void eliminaProdotto(ProdottoDTO prodotto) {
		try {
			gestoreProdotti.removeProdotto(prodotto);
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(
					"messaggesGestioneProdotti",
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Errore nell'eliminazione del prodotto.",
							e.getMessage()));
			return;
		}
		prodottiDTOList.remove(prodotto);
		FacesContext.getCurrentInstance().addMessage(
				"messaggesGestioneProdotti",
				new FacesMessage("Prodotto rimosso con successo!"));
	}
	
	public int calcolaPrezzoTotale(int idProdotto, int numDays) {
		return gestoreProdotti.calcolaPrezzoTotale(idProdotto, numDays);
	}
}
